package Laborum2.repository;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import Laborum2.Basicas.Ofertas;
import Laborum2.Basicas.Temporal;

@Component
public class JdbcOfertasRepository implements OfertasRepository {

	@Autowired
	private DataSource dataSource;
	
	List<Ofertas> of1 = new ArrayList <Ofertas>();
	List<Ofertas> of2 = new ArrayList <Ofertas>();
	Ofertas oferta = new Ofertas();
	Calendar cal=Calendar.getInstance();
	
	List<Temporal> tempo = new ArrayList <Temporal>();
	Temporal temporal = new Temporal();

	public List<Ofertas> obtenerOfertas() {
		// Inicializo variables
		of1 = new ArrayList <Ofertas>();
		String sql = "SELECT * from ofertas";
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		try{
			// Conexion
			conn = dataSource.getConnection();
			ps = conn.prepareStatement(sql);
			rs = ps.executeQuery();
			while(rs.next()){
				oferta = new Ofertas();
				// Cargo valores en la clase oferta
				oferta.setIdOferta(rs.getInt("idOferta"));
				oferta.setTitOferta(rs.getString("titOferta"));
				oferta.setVacOferta(rs.getInt("vacOferta"));
				oferta.setFecPubOferta(rs.getDate("fecPubOferta"));
				oferta.setDurOferta(rs.getInt("durOferta"));
				oferta.setDescOferta(rs.getString("descOferta"));
				oferta.setRucEmpresa(rs.getString("rucEmpresa"));
				oferta.setIdCargo(rs.getInt("idCargo"));
				oferta.setEstado(rs.getInt("estado"));
				
				// Cargo valores en la lista
				of1.add(oferta);
			}
		}catch(Exception ex){
			
		}
		// Cierro Conexion
		closeConecction(rs, ps, conn);
		
		//Retorno Lista
		return of1;
	}

	public List<Ofertas> obtenerOfertasId(int idOferta) {
		// Inicializo variables
		of1 = new ArrayList <Ofertas>();
		oferta = new Ofertas();
		String sql = "SELECT * from ofertas where idOferta = ?";
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		try{
			// Conexion
			conn = dataSource.getConnection();
			ps = conn.prepareStatement(sql);
			ps.setInt(1, idOferta);
			rs = ps.executeQuery();
			while(rs.next()){
				oferta = new Ofertas();
				// Cargo valores en la clase oferta
				oferta.setIdOferta(rs.getInt("idOferta"));
				oferta.setTitOferta(rs.getString("titOferta"));
				oferta.setVacOferta(rs.getInt("vacOferta"));
				oferta.setFecPubOferta(rs.getDate("fecPubOferta"));
				oferta.setDurOferta(rs.getInt("durOferta"));
				oferta.setDescOferta(rs.getString("descOferta"));
				oferta.setRucEmpresa(rs.getString("rucEmpresa"));
				oferta.setIdCargo(rs.getInt("idCargo"));
				oferta.setEstado(rs.getInt("estado"));
				
				// Cargo valores en la lista
				of1.add(oferta);
			}
		}catch(Exception ex){
			
		}
		// Cierro Conexion
		closeConecction(rs, ps, conn);
		
		//Retorno Lista
		return of1;
	}
	
	public int obtenerIdOferta(int codigo) {
		for(int i=0;i<of1.size();i++){			
			if(of1.get(i).getIdOferta()==codigo){
				return of1.get(i).getIdOferta();
			}
		}
		return 0;
	}
	
	public void ingresar(Ofertas oferta) {
		//if(obtenerIdOferta(oferta.getIdOferta())==0){
		//	of1.add(oferta);
		//}else {
		//	throw new RuntimeException("Oferta ya registrado");
		//}
		
		// Valido que oferta no exista
		if (obtenerOfertasId(oferta.getIdOferta()).size()==0) {
			// Inicializo variables
			String sql = "insert into ofertas (idOferta, titOferta, vacOferta, fecPubOferta, durOferta, descOferta, rucEmpresa, idCargo, estado) values (?, ?, ?, ?, ?, ?, ?, ?, ?)";
			Connection conn = null;
			PreparedStatement ps = null;
			try {
				// Conexion
				conn = dataSource.getConnection();
				ps = conn.prepareStatement(sql);
				
				//Asigna Valores
				ps.setInt(1, oferta.getIdOferta());
				ps.setString(2, oferta.getTitOferta());
				ps.setInt(3, oferta.getVacOferta());
				ps.setDate(4, oferta.getFecPubOferta());
				ps.setInt(5, oferta.getDurOferta());
				ps.setString(6, oferta.getDescOferta());
				ps.setString(7, oferta.getRucEmpresa());
				ps.setInt(8, oferta.getIdCargo());
				ps.setInt(9, oferta.getEstado());
				
				// Ejecuto Query
				ps.execute();
			} catch (Exception ex) {
			
			}
			// Cierro Conexion
			closeConecction1(ps, conn);
		} else {
			throw new RuntimeException("Oferta ya registrada");
		}
	}

	public void editar(int idOferta, Ofertas oferta) {
		//for(int i=0;i<of1.size();i++){
		//	if(of1.get(i).getIdOferta()==idOferta){			
		//		of1.add(of1.indexOf(of1.get(i)),oferta);				
		//	}
		//}
		if (obtenerOfertasId(oferta.getIdOferta()).size()>0) {
			String sql = "update ofertas set titOferta = ?, vacOferta = ?,  fecPubOferta = ?, durOferta = ?, descOferta = ?," +
					" rucEmpresa = ?, idCargo = ?, estado = ? where idOferta = ?";
			Connection conn = null; 
			PreparedStatement ps = null;
			try {
				// Conexion
				conn = dataSource.getConnection();
				ps = conn.prepareStatement(sql);
				
				//Asigna Valores
				ps.setString(1, oferta.getTitOferta());
				ps.setInt(2, oferta.getVacOferta());
				ps.setDate(3, oferta.getFecPubOferta());
				ps.setInt(4, oferta.getDurOferta());
				ps.setString(5, oferta.getDescOferta());
				ps.setString(6, oferta.getRucEmpresa());
				ps.setInt(7, oferta.getIdCargo());
				ps.setInt(8, oferta.getEstado());
				ps.setInt(9, idOferta);
				
				// Ejecuto Query
				ps.executeUpdate();
			} catch (Exception ex) {
			
			}
			// Cierro Conexion
			closeConecction1(ps, conn);
		}else {
			throw new RuntimeException("Oferta no existe");
		}		
	}

	public void eliminar(int idOferta) {
		//for(int i=0;i<of1.size();i++){
		//	if(obtenerIdOferta(codigo)==0){	
		//		of1.remove(of1.get(i).getIdOferta());
		//	}else{
		//		throw new RuntimeException("Usuario ya registrado");
		//	}
		//}
		if ((obtenerOfertasId(idOferta).size()>0) && (obtenerOfertasId(idOferta).get(0).getEstado() == 1)) {
			String sql = "update ofertas set estado = 0 where idOferta = ?";
			Connection conn = null; 
			PreparedStatement ps = null;
			try {
				// Conexion
				conn = dataSource.getConnection();
				ps = conn.prepareStatement(sql);
				
				//Asigna Valores
				ps.setInt(1, idOferta);
				
				// Ejecuto Query
				ps.executeUpdate();
			} catch (Exception ex) {
			
			}
			// Cierro Conexion
			closeConecction1(ps, conn);
		}else {
			throw new RuntimeException("Oferta no existe o ya se encuentra inactiva");
		}		
	}

	public List<Ofertas> buscarXTitulo(String titulo) {
		//for(int i=0;i<of1.size();i++){			
		//	if(of1.get(i).getTitOferta().equals(titulo)){
		//		return of1;
		//	}
		//}
		//return of1;
		
		// Inicializo variables
		of1 = new ArrayList <Ofertas>();
		oferta = new Ofertas();
		String sql = "SELECT * from ofertas where titOferta like ? order by titOferta";
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		try{
			// Conexion
			conn = dataSource.getConnection();
			ps = conn.prepareStatement(sql);
			ps.setString(1, "%" + titulo + "%");
			rs = ps.executeQuery();
			while(rs.next()){
				oferta = new Ofertas();
				// Cargo valores en la clase oferta
				oferta.setIdOferta(rs.getInt("idOferta"));
				oferta.setTitOferta(rs.getString("titOferta"));
				oferta.setVacOferta(rs.getInt("vacOferta"));
				oferta.setFecPubOferta(rs.getDate("fecPubOferta"));
				oferta.setDurOferta(rs.getInt("durOferta"));
				oferta.setDescOferta(rs.getString("descOferta"));
				oferta.setRucEmpresa(rs.getString("rucEmpresa"));
				oferta.setIdCargo(rs.getInt("idCargo"));
				oferta.setEstado(rs.getInt("estado"));
				
				// Cargo valores en la lista
				of1.add(oferta);
			}
		}catch(Exception ex){
			
		}
		// Cierro Conexion
		closeConecction(rs, ps, conn);
		
		//Retorno Lista
		return of1;
	}

	public List<Ofertas> buscarXDias(int dias) {		
	    //Calendar cal = new GregorianCalendar(); 
		//cal.setTimeInMillis(fecha.getTime()); 
		//cal.add(Calendar.DATE, - cant); 
	      
		//for(int i=0;i<of1.size();i++){	
		//	if(of1.get(i).getFecPubOferta().equals(fecha) && of1.get(i).getFecPubOferta().equals(new Date(cal.getTimeInMillis())) ){
		//		of2.add(of1.indexOf(of1.get(i)),oferta);	
		//	}
		//}
		//return of2;
		
		// Inicializo variables para fecha
	    Calendar cal=Calendar.getInstance();
	  	cal.setTime(new java.util.Date());
	  	java.sql.Date fecFin = new java.sql.Date(cal.getTime().getTime());
	  	cal.add(cal.DATE, -dias);
	    java.sql.Date fecIni = new java.sql.Date(cal.getTime().getTime());
	    int dI = fecIni.getDate();
	    int mI = fecIni.getMonth() + 1;
	    int aI = fecIni.getYear() + 1900;
	    int dF = fecFin.getDate();
	    int mF = fecFin.getMonth() + 1;
	    int aF = fecFin.getYear() + 1900;
	     
	    // Inicializo variables
		of1 = new ArrayList <Ofertas>();
		oferta = new Ofertas();
		String sql = "SELECT * from ofertas where (Year(fecPubOferta) >= ? and Month(fecPubOferta) >= ? and Day(fecPubOferta) >= ?) and" +
				"(Year(fecPubOferta) <= ? and Month(fecPubOferta) <= ? and Day(fecPubOferta) <= ?) order by titOferta";
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		try{
			// Conexion
			conn = dataSource.getConnection();
			ps = conn.prepareStatement(sql);
			ps.setInt(1, aI);
			ps.setInt(2, mI);
			ps.setInt(3, dI);
			ps.setInt(4, aF);
			ps.setInt(5, mF);
			ps.setInt(6, dF);
			
			rs = ps.executeQuery();
			while(rs.next()){
				oferta = new Ofertas();
				// Cargo valores en la clase oferta
				oferta.setIdOferta(rs.getInt("idOferta"));
				oferta.setTitOferta(rs.getString("titOferta"));
				oferta.setVacOferta(rs.getInt("vacOferta"));
				oferta.setFecPubOferta(rs.getDate("fecPubOferta"));
				oferta.setDurOferta(rs.getInt("durOferta"));
				oferta.setDescOferta(rs.getString("descOferta"));
				oferta.setRucEmpresa(rs.getString("rucEmpresa"));
				oferta.setIdCargo(rs.getInt("idCargo"));
				oferta.setEstado(rs.getInt("estado"));
				
				// Cargo valores en la lista
				of1.add(oferta);
			}
		}catch(Exception ex){
			
		}
		// Cierro Conexion
		closeConecction(rs, ps, conn);
		
		//Retorno Lista
		return of1;
	}
	
	public List<Ofertas> obtenerOfertasXCargo(int cargo) {
		// Inicializo variables
		of1 = new ArrayList <Ofertas>();
		String sql = "SELECT * from ofertas where idCargo = ? and estado = 1 order by titOferta";
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		try{
			// Conexion
			conn = dataSource.getConnection();
			ps = conn.prepareStatement(sql);
			ps.setInt(1, cargo);
			rs = ps.executeQuery();
			while(rs.next()){
				oferta = new Ofertas();
				// Cargo valores en la clase oferta
				oferta.setIdOferta(rs.getInt("idOferta"));
				oferta.setTitOferta(rs.getString("titOferta"));
				oferta.setVacOferta(rs.getInt("vacOferta"));
				oferta.setFecPubOferta(rs.getDate("fecPubOferta"));
				oferta.setDurOferta(rs.getInt("durOferta"));
				oferta.setDescOferta(rs.getString("descOferta"));
				oferta.setRucEmpresa(rs.getString("rucEmpresa"));
				oferta.setIdCargo(rs.getInt("idCargo"));
				oferta.setEstado(rs.getInt("estado"));
				
				// Cargo valores en la lista
				of1.add(oferta);
			}
		}catch(Exception ex){
			
		}
		// Cierro Conexion
		closeConecction(rs, ps, conn);
		
		//Retorno Lista
		return of1;
	}
	
	private void closeConecction(ResultSet rs, PreparedStatement ps,
			Connection conn) {

		if (rs != null) {
			try {
				// Close to prevent database cursor exhaustion
				rs.close();
			} catch (SQLException ex) {
			}
		}
		if (ps != null) {
			try {
				// Close to prevent database cursor exhaustion
				ps.close();
			} catch (SQLException ex) {
			}
		}
		if (conn != null) {
			try {
				// Close to prevent database connection exhaustion
				conn.close();
			} catch (SQLException ex) {
			}
		}

	}	
	
	private void closeConecction1(PreparedStatement ps, Connection conn) {

		if (ps != null) {
			try {
				// Close to prevent database cursor exhaustion
				ps.close();
			} catch (SQLException ex) {
			}
		}
		if (conn != null) {
			try {
				// Close to prevent database connection exhaustion
				conn.close();
			} catch (SQLException ex) {
			}
		}
	}

	@Override
	public List<Ofertas> obtenerOfertasPorEmpresa(String ruc) {
		of1 = new ArrayList<Ofertas>();

		String sql = "SELECT * from ofertas where rucEmpresa = ?";
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		try {
			// Conexion
			Ofertas oferta = new Ofertas();
			conn = dataSource.getConnection();
			ps = conn.prepareStatement(sql);
			ps.setString(1, ruc);
			
			rs = ps.executeQuery();
			while (rs.next()) {
				oferta = new Ofertas();
				
				// Cargo valores en la clase oferta
				oferta.setTitOferta(rs.getString("titOferta"));
				oferta.setVacOferta(rs.getInt("vacOferta"));
				oferta.setDurOferta(rs.getInt("durOferta"));
				oferta.setDescOferta(rs.getString("descOferta"));
				oferta.setRucEmpresa(rs.getString("rucEmpresa"));
				oferta.setIdCargo(rs.getInt("idCargo"));


				// Cargo valores en la lista
				of1.add(oferta);
			}
		} catch (Exception ex) {

		}
		// Cierro Conexion
		closeConecction(rs, ps, conn);

		// Retorno Lista
		return of1;
	}
	@Override
	public List<Temporal> obtenerCantidadDeOfertasporAnunciante() {
		tempo = new ArrayList<Temporal>();
		String sql = "SELECT rucEmpresa, count(*) as CantidadOfertas from ofertas group by rucEmpresa order by count(*) desc";
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		try{
			conn = dataSource.getConnection();
			ps = conn.prepareStatement(sql);
			rs = ps.executeQuery();
			while(rs.next()){
				temporal = new Temporal();
				temporal.setCampo(rs.getString("rucEmpresa"));
				temporal.setCantidad(rs.getInt("CantidadOfertas"));									 
				tempo.add(temporal);
			}
		}catch(Exception ex){
			
		}
		closeConecction(rs, ps, conn);
		return tempo;
	}

}
